{
 "cells": [
  {
   "cell_type": "code",
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2025-01-14T12:34:58.310212Z",
     "start_time": "2025-01-14T12:34:56.231400Z"
    }
   },
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn import datasets"
   ],
   "outputs": [],
   "execution_count": 3
  },
  {
   "cell_type": "code",
   "source": [
    "x=np.arange(0,12).reshape(3,4)\n",
    "y=np.array([True,False,True])\n",
    "print(y)\n",
    "print(x)\n",
    "x[y,1]"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2025-01-14T12:35:00.890884Z",
     "start_time": "2025-01-14T12:35:00.877804Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ True False  True]\n",
      "[[ 0  1  2  3]\n",
      " [ 4  5  6  7]\n",
      " [ 8  9 10 11]]\n",
      "[1 9]\n"
     ]
    }
   ],
   "execution_count": 4
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# n_samples=50000, noise=0.3, random_state=42的意思是生成50000个数据，噪声为0.3，随机种子为42"
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(50000, 2)\n",
      "(50000,)\n",
      "[0 1]\n"
     ]
    }
   ],
   "source": [
    "#x是特征，y是标签\n",
    "x, y = datasets.make_moons(n_samples=50000, noise=0.3, random_state=42)\n",
    "print(x.shape)\n",
    "print(y.shape)\n",
    "print(np.unique(y))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-07-15T08:17:54.637188600Z",
     "start_time": "2024-07-15T08:17:54.615238600Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:19:29.488764100Z",
     "start_time": "2024-07-15T08:19:28.842900400Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "plt.scatter(x[y == 0, 0], x[y == 0, 1])  #拿到特征中标签为0的第0列，拿到标签为0的第一列\n",
    "plt.scatter(x[y == 1, 0], x[y == 1, 1]) #拿到特征中标签为1的第0列，拿到标签为1的第一列\n",
    "plt.legend(['0', '1'])\n",
    "plt.show()  #图形的点颜色是自动的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [
    "# x[y == 0, 0]"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:19:53.476054700Z",
     "start_time": "2024-07-15T08:19:53.464257300Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "array([[ 0.71820567, -0.21809028],\n       [ 0.11096372,  1.10964541],\n       [ 0.61562814, -0.06539887],\n       [ 0.46175947,  1.17926518],\n       [ 1.22553968, -0.51211163],\n       [ 1.27989488,  0.19395679],\n       [ 0.51249388,  1.21727796],\n       [ 1.97017831,  0.3277893 ],\n       [ 0.63961463,  0.9269041 ],\n       [ 0.38809941, -0.32770396]])"
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x[0:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:20:32.944417300Z",
     "start_time": "2024-07-15T08:20:32.930957700Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "array([0, 1], dtype=int64)"
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.unique(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:20:55.794087Z",
     "start_time": "2024-07-15T08:20:55.404618100Z"
    }
   },
   "outputs": [],
   "source": [
    "#默认分割比例是75%和25%\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=42)"
   ]
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 逻辑回归使用sigmoid函数，SVM(向量机)使用核函数，决策树使用信息增益"
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:21:07.083583600Z",
     "start_time": "2024-07-15T08:21:06.745883700Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "0.85344"
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "#逻辑回归是搞分类的\n",
    "log_clf = LogisticRegression()\n",
    "log_clf.fit(x_train, y_train)\n",
    "log_clf.score(x_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:21:48.363271300Z",
     "start_time": "2024-07-15T08:21:27.485863Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "0.91216"
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.svm import SVC\n",
    "\n",
    "svm_clf = SVC() #支持向量机\n",
    "svm_clf.fit(x_train, y_train)\n",
    "svm_clf.score(x_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:21:51.189457200Z",
     "start_time": "2024-07-15T08:21:50.576968800Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "0.87504"
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.tree import DecisionTreeClassifier\n",
    "\n",
    "dt_clf = DecisionTreeClassifier()\n",
    "dt_clf.fit(x_train, y_train)\n",
    "dt_clf.score(x_test, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "# 1 手动实现投票分类器"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:22:25.177914700Z",
     "start_time": "2024-07-15T08:22:16.655798Z"
    }
   },
   "outputs": [],
   "source": [
    "#训练好模型，测试集做预测\n",
    "y_predict1 = log_clf.predict(x_test)\n",
    "y_predict2 = svm_clf.predict(x_test)\n",
    "y_predict3 = dt_clf.predict(x_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:23:40.462568900Z",
     "start_time": "2024-07-15T08:23:40.454947Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "array([1, 1, 1, 0, 0, 0, 0, 0, 0, 1])"
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#bagging，纯手动bagging\n",
    "y_predict = np.array((y_predict1 + y_predict2 + y_predict3) >= 2, dtype='int')\n",
    "y_predict[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-04-19T08:48:11.732548200Z",
     "start_time": "2024-04-19T08:48:11.708564Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "array([1, 1, 1, 0, 0, 0, 0, 1, 0, 1], dtype=int64)"
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_test[:10]"
   ]
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# accuracy_score计算准确率的"
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:24:07.261303400Z",
     "start_time": "2024-07-15T08:24:07.236523700Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "0.904"
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "#accuracy_score计算准确率的\n",
    "accuracy_score(y_test, y_predict)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": "# 2 集成学习VotingClassifier(并行),voting ()是投票的模式，hard模式是少数服从多数，soft模式是加权平均"
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:26:37.630470300Z",
     "start_time": "2024-07-15T08:26:37.584499400Z"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.ensemble import VotingClassifier\n",
    "\n",
    "#hard模式就是少数服从多数\n",
    "voting_clf = VotingClassifier(estimators=[\n",
    "    ('log_clf', LogisticRegression()),\n",
    "    ('svm_clf', SVC()),\n",
    "    ('dt_clf', DecisionTreeClassifier())], voting='hard')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:27:00.058672700Z",
     "start_time": "2024-07-15T08:26:39.468324700Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "0.90472"
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "voting_clf.fit(x_train, y_train)\n",
    "voting_clf.score(x_test, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "更合理的投票，应该有权值\n",
    "唱歌比赛的投票?(评委的投票权重与观众不一样)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:29:11.967089700Z",
     "start_time": "2024-07-15T08:27:37.656881400Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "0.9044"
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# hard和soft区别请看课件解释,训练时间久\n",
    "voting_clf2 = VotingClassifier(estimators=[\n",
    "    ('log_clf', LogisticRegression()),\n",
    "    ('svm_clf', SVC(probability=True)),  #支持向量机中需要加入probability\n",
    "    ('dt_clf', DecisionTreeClassifier())], voting='soft')\n",
    "voting_clf2.fit(x_train, y_train)\n",
    "voting_clf2.score(x_test, y_test)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": "# 使用bagging，这个是并行的，速度快"
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "37500.0"
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "50000*0.75"
   ]
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# DecisionTreeClassifier()决策树分类器的工作原理是基于特征的值对数据进行划分，通过一系列的判断条件（如“特征 A 是否大于某个值？”）将数据分配到不同的类别中。最终，模型会生成一棵树，树的每个路径代表一种分类规则。"
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "outputs": [
    {
     "data": {
      "text/plain": "0.9124"
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.tree import DecisionTreeClassifier  #用决策树集成上千模型\n",
    "from sklearn.ensemble import BaggingClassifier\n",
    "\n",
    "#估计器数目是5000呢？bootstrap是有放回抽样,max_samples不可以超过训练集的数目37500\n",
    "bagging_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=300,\n",
    "                                max_samples=3000, bootstrap=True)\n",
    "bagging_clf.fit(x_train, y_train)\n",
    "bagging_clf.score(x_test, y_test)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:32:57.976836200Z",
     "start_time": "2024-07-15T08:32:53.680444800Z"
    }
   }
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "# 3 oob设计"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:35:18.024524900Z",
     "start_time": "2024-07-15T08:35:12.604391500Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "0.9154666666666667"
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.tree import DecisionTreeClassifier  #用决策树集成上千模型\n",
    "from sklearn.ensemble import BaggingClassifier\n",
    "#当去做有放回的抽样时，把没有取到的样本作为验证集，可以用oob_score来评估\n",
    "bagging_clf2 = BaggingClassifier(DecisionTreeClassifier(), n_estimators=500, max_samples=1000,\n",
    "                                 bootstrap=True,\n",
    "                                 oob_score=True)\n",
    "bagging_clf2.fit(x_train, y_train)\n",
    "bagging_clf2.oob_score_  #拿没有取到的样本作为验证集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "outputs": [
    {
     "data": {
      "text/plain": "0.91288"
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bagging_clf2.score(x_test, y_test)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:35:47.625851600Z",
     "start_time": "2024-07-15T08:35:47.044142200Z"
    }
   }
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### njobs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.tree import DecisionTreeClassifier  #用决策树集成上千模型\n",
    "from sklearn.ensemble import BaggingClassifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:36:45.247187Z",
     "start_time": "2024-07-15T08:36:40.093705100Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: total: 5 s\n",
      "Wall time: 5.15 s\n"
     ]
    },
    {
     "data": {
      "text/plain": "0.91176"
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%time\n",
    "bagging_clf = BaggingClassifier(DecisionTreeClassifier(),\n",
    "                                n_estimators=500, max_samples=2000,\n",
    "                                bootstrap=True)\n",
    "bagging_clf.fit(x_train, y_train)\n",
    "bagging_clf.score(x_test, y_test)\n",
    "#cpu time是实际cpu运行算法时间，wall time是墙上真实时间，就是real time（包含了进程启动时间，I/O等待时间等）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:36:53.890698700Z",
     "start_time": "2024-07-15T08:36:49.395623100Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: total: 406 ms\n",
      "Wall time: 4.5 s\n"
     ]
    },
    {
     "data": {
      "text/plain": "0.91192"
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%time\n",
    "#多核使用的时间更小, %%time要顶格来写\n",
    "bagging_clf = BaggingClassifier(DecisionTreeClassifier(),\n",
    "                                n_estimators=500, max_samples=2000,\n",
    "                                bootstrap=True, n_jobs=-1)\n",
    "bagging_clf.fit(x_train, y_train)\n",
    "bagging_clf.score(x_test, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "# 4 bootstrap_features  对特征进行采样"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:39:32.088521200Z",
     "start_time": "2024-07-15T08:39:27.926172900Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "0.88618"
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#因为我们就两个特征，所以max_features设置为1,得到的分值较低是因为我们特征较少，采用随机特征不合适\n",
    "#这个是只对特征进行采样\n",
    "random_subspaces_clf = BaggingClassifier(DecisionTreeClassifier(),\n",
    "                                         n_estimators=500, max_samples=500, oob_score=True,\n",
    "                                         bootstrap=True, n_jobs=-1,\n",
    "                                         max_features=1, bootstrap_features=True)\n",
    "random_subspaces_clf.fit(x, y)\n",
    "random_subspaces_clf.oob_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:40:21.116127100Z",
     "start_time": "2024-07-15T08:40:20.094203700Z"
    }
   },
   "outputs": [
    {
     "ename": "ValueError",
     "evalue": "max_samples must be <= n_samples",
     "output_type": "error",
     "traceback": [
      "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
      "\u001B[1;31mValueError\u001B[0m                                Traceback (most recent call last)",
      "Cell \u001B[1;32mIn[25], line 6\u001B[0m\n\u001B[0;32m      1\u001B[0m \u001B[38;5;66;03m# 这里是为了验证总的抽样的样本数不能大于训练集的数目\u001B[39;00m\n\u001B[0;32m      2\u001B[0m random_patches_clf \u001B[38;5;241m=\u001B[39m BaggingClassifier(DecisionTreeClassifier(),\n\u001B[0;32m      3\u001B[0m                                        n_estimators\u001B[38;5;241m=\u001B[39m\u001B[38;5;241m500\u001B[39m, max_samples\u001B[38;5;241m=\u001B[39m\u001B[38;5;241m50001\u001B[39m, oob_score\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mTrue\u001B[39;00m,\n\u001B[0;32m      4\u001B[0m                                        bootstrap\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mTrue\u001B[39;00m, n_jobs\u001B[38;5;241m=\u001B[39m\u001B[38;5;241m-\u001B[39m\u001B[38;5;241m1\u001B[39m,\n\u001B[0;32m      5\u001B[0m                                        max_features\u001B[38;5;241m=\u001B[39m\u001B[38;5;241m1\u001B[39m, bootstrap_features\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mTrue\u001B[39;00m)\n\u001B[1;32m----> 6\u001B[0m \u001B[43mrandom_patches_clf\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mfit\u001B[49m\u001B[43m(\u001B[49m\u001B[43mx\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43my\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m      7\u001B[0m random_patches_clf\u001B[38;5;241m.\u001B[39moob_score_\n\u001B[0;32m      8\u001B[0m \u001B[38;5;66;03m#这个代码有另外一个名字就是随机森林\u001B[39;00m\n",
      "File \u001B[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\sklearn\\utils\\validation.py:69\u001B[0m, in \u001B[0;36m_deprecate_positional_args.<locals>._inner_deprecate_positional_args.<locals>.inner_f\u001B[1;34m(*args, **kwargs)\u001B[0m\n\u001B[0;32m     67\u001B[0m extra_args \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mlen\u001B[39m(args) \u001B[38;5;241m-\u001B[39m \u001B[38;5;28mlen\u001B[39m(all_args)\n\u001B[0;32m     68\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m extra_args \u001B[38;5;241m<\u001B[39m\u001B[38;5;241m=\u001B[39m \u001B[38;5;241m0\u001B[39m:\n\u001B[1;32m---> 69\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[43mf\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43margs\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43mkwargs\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m     71\u001B[0m \u001B[38;5;66;03m# extra_args > 0\u001B[39;00m\n\u001B[0;32m     72\u001B[0m args_msg \u001B[38;5;241m=\u001B[39m [\n\u001B[0;32m     73\u001B[0m     \u001B[38;5;124m\"\u001B[39m\u001B[38;5;132;01m{}\u001B[39;00m\u001B[38;5;124m=\u001B[39m\u001B[38;5;132;01m{}\u001B[39;00m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;241m.\u001B[39mformat(name, arg)\n\u001B[0;32m     74\u001B[0m     \u001B[38;5;28;01mfor\u001B[39;00m name, arg \u001B[38;5;129;01min\u001B[39;00m \u001B[38;5;28mzip\u001B[39m(kwonly_args[:extra_args], args[\u001B[38;5;241m-\u001B[39mextra_args:])\n\u001B[0;32m     75\u001B[0m ]\n",
      "File \u001B[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\sklearn\\base.py:1473\u001B[0m, in \u001B[0;36m_fit_context.<locals>.decorator.<locals>.wrapper\u001B[1;34m(estimator, *args, **kwargs)\u001B[0m\n\u001B[0;32m   1466\u001B[0m     estimator\u001B[38;5;241m.\u001B[39m_validate_params()\n\u001B[0;32m   1468\u001B[0m \u001B[38;5;28;01mwith\u001B[39;00m config_context(\n\u001B[0;32m   1469\u001B[0m     skip_parameter_validation\u001B[38;5;241m=\u001B[39m(\n\u001B[0;32m   1470\u001B[0m         prefer_skip_nested_validation \u001B[38;5;129;01mor\u001B[39;00m global_skip_validation\n\u001B[0;32m   1471\u001B[0m     )\n\u001B[0;32m   1472\u001B[0m ):\n\u001B[1;32m-> 1473\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[43mfit_method\u001B[49m\u001B[43m(\u001B[49m\u001B[43mestimator\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43margs\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43mkwargs\u001B[49m\u001B[43m)\u001B[49m\n",
      "File \u001B[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\sklearn\\ensemble\\_bagging.py:402\u001B[0m, in \u001B[0;36mBaseBagging.fit\u001B[1;34m(self, X, y, sample_weight, **fit_params)\u001B[0m\n\u001B[0;32m    399\u001B[0m     sample_weight \u001B[38;5;241m=\u001B[39m _check_sample_weight(sample_weight, X, dtype\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mNone\u001B[39;00m)\n\u001B[0;32m    400\u001B[0m     fit_params[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124msample_weight\u001B[39m\u001B[38;5;124m\"\u001B[39m] \u001B[38;5;241m=\u001B[39m sample_weight\n\u001B[1;32m--> 402\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_fit\u001B[49m\u001B[43m(\u001B[49m\u001B[43mX\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43my\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mmax_samples\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mmax_samples\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43mfit_params\u001B[49m\u001B[43m)\u001B[49m\n",
      "File \u001B[1;32m~\\AppData\\Roaming\\Python\\Python312\\site-packages\\sklearn\\ensemble\\_bagging.py:481\u001B[0m, in \u001B[0;36mBaseBagging._fit\u001B[1;34m(self, X, y, max_samples, max_depth, check_input, **fit_params)\u001B[0m\n\u001B[0;32m    478\u001B[0m     max_samples \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mint\u001B[39m(max_samples \u001B[38;5;241m*\u001B[39m X\u001B[38;5;241m.\u001B[39mshape[\u001B[38;5;241m0\u001B[39m])\n\u001B[0;32m    480\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m max_samples \u001B[38;5;241m>\u001B[39m X\u001B[38;5;241m.\u001B[39mshape[\u001B[38;5;241m0\u001B[39m]:\n\u001B[1;32m--> 481\u001B[0m     \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mValueError\u001B[39;00m(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mmax_samples must be <= n_samples\u001B[39m\u001B[38;5;124m\"\u001B[39m)\n\u001B[0;32m    483\u001B[0m \u001B[38;5;66;03m# Store validated integer row sampling value\u001B[39;00m\n\u001B[0;32m    484\u001B[0m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_max_samples \u001B[38;5;241m=\u001B[39m max_samples\n",
      "\u001B[1;31mValueError\u001B[0m: max_samples must be <= n_samples"
     ]
    }
   ],
   "source": [
    "# 这里是为了验证总的抽样的样本数不能大于训练集的数目\n",
    "random_patches_clf = BaggingClassifier(DecisionTreeClassifier(),\n",
    "                                       n_estimators=500, max_samples=50001, oob_score=True,\n",
    "                                       bootstrap=True, n_jobs=-1,\n",
    "                                       max_features=1, bootstrap_features=True)\n",
    "random_patches_clf.fit(x, y)\n",
    "random_patches_clf.oob_score_\n",
    "#这个代码有另外一个名字就是随机森林"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:41:24.893739700Z",
     "start_time": "2024-07-15T08:41:24.885744400Z"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier"
   ]
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# %%time是用来测试运行时间的，-1表示使用所有核，n_jobs=-1表示使用所有核，n_jobs=2表示使用2核"
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:41:40.426737100Z",
     "start_time": "2024-07-15T08:41:26.564269300Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: total: 1min 14s\n",
      "Wall time: 13.9 s\n"
     ]
    },
    {
     "data": {
      "text/plain": "0.90322"
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%time\n",
    "\n",
    "rc_clf = RandomForestClassifier(n_estimators=500, random_state=666,\n",
    "                                oob_score=True, n_jobs=-1)\n",
    "rc_clf.fit(x, y)\n",
    "rc_clf.oob_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: total: 8.03 s\n",
      "Wall time: 1.53 s\n"
     ]
    },
    {
     "data": {
      "text/plain": "0.90296"
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%time\n",
    "rc_clf = RandomForestClassifier(max_samples=37500, n_jobs=-1)\n",
    "rc_clf.fit(x_train, y_train)\n",
    "rc_clf.score(x_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:41:57.158954600Z",
     "start_time": "2024-07-15T08:41:49.182493600Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: total: 36.8 s\n",
      "Wall time: 7.55 s\n"
     ]
    },
    {
     "data": {
      "text/plain": "0.90962"
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%time\n",
    "#max_leaf_nodes 最大的叶子结点数\n",
    "rc_clf2 = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16,\n",
    "                                 random_state=666,\n",
    "                                 oob_score=True, n_jobs=-1)\n",
    "rc_clf2.fit(x, y)\n",
    "rc_clf2.oob_score_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "# 5 Extra-Trees\n",
    "ExtraTreesClassifier 是一种机器学习算法，属于基于决策树的集成方法家族。\n",
    "它随机选择特征子集和数据样本来构建多个决策树，并将它们的预测聚合起来做出最终预测。\n",
    "它可用于分类任务，并以处理嘈杂和高维数据的能力而闻名。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:45:11.260388Z",
     "start_time": "2024-07-15T08:45:04.792884200Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "0.90624"
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.ensemble import ExtraTreesClassifier\n",
    "\n",
    "et_clf = ExtraTreesClassifier(n_estimators=500, oob_score=True,\n",
    "                              bootstrap=True, n_jobs=-1)\n",
    "et_clf.fit(x, y)\n",
    "et_clf.oob_score_"
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "# Boosting"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "# 5 串行（包含adaboost和GBDT）"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:46:14.878104400Z",
     "start_time": "2024-07-15T08:46:14.870109900Z"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.ensemble import AdaBoostClassifier\n",
    "from sklearn.tree import DecisionTreeClassifier"
   ]
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# algorithm='SAMME'是指使用的是SAMME算法，也就是AdaBoost.SAMME.R算法。"
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:47:16.925630600Z",
     "start_time": "2024-07-15T08:47:16.293769Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: total: 219 ms\n",
      "Wall time: 222 ms\n"
     ]
    },
    {
     "data": {
      "text/plain": "0.876"
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%time\n",
    "ada_clf = AdaBoostClassifier(DecisionTreeClassifier(),algorithm='SAMME',\n",
    "                             n_estimators=500)\n",
    "ada_clf.fit(x_train, y_train)\n",
    "ada_clf.score(x_test, y_test)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "ExecuteTime": {
     "end_time": "2024-07-15T08:51:50.113231400Z",
     "start_time": "2024-07-15T08:51:25.285485900Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "0.91192"
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#它默认用的也是决策树，增加了基分类器的数目后，准确率提升\n",
    "from sklearn.ensemble import GradientBoostingClassifier\n",
    "\n",
    "gb_clf = GradientBoostingClassifier(max_depth=3, n_estimators=500)\n",
    "gb_clf.fit(x_train, y_train)\n",
    "gb_clf.score(x_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.1972245773362196\n"
     ]
    },
    {
     "data": {
      "text/plain": "0.0"
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "print(np.log(9))  #当错误率是0.1时权重是2.19\n",
    "np.log((1-0.5)/0.5)  #当错误率是0.5时，权重是0"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
